Ach ten lidsky pojem casu, aneb jak scitat hodiny?

Otázka od: David Michal

18. 9. 2002 15:21

Zdravim,
V databazi (MSSQL) mam v tabulce field Hours(datetime). V tomto fieldu
ukladam pocet hodin a minut. Nyni bych potreboval udelat SUM(hours) do
reportu. Jenomze SUM na datetime udelat nemuzu, a pokud to prekonvertuji do
real, pak pri SUM dostanu nesmysl. Resil jste jiz nekdy nekdo neco
podobneho? Jak dostanu soucet casu do lidskeho formatu napr. 182:30 (182h
30min).
Diky,
David
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.389 / Virus Database: 220 - Release Date: 16/09/2002

Odpovedá: Zbysek Hlinka

18. 9. 2002 17:27

On 18 Sep 2002 at 16:00, David Michal wrote:

> Zdravim,
> V databazi (MSSQL) mam v tabulce field Hours(datetime). V tomto fieldu
> ukladam pocet hodin a minut. Nyni bych potreboval udelat SUM(hours) do
> reportu. Jenomze SUM na datetime udelat nemuzu, a pokud to
> prekonvertuji do real, pak pri SUM dostanu nesmysl. Resil jste jiz
> nekdy nekdo neco podobneho? Jak dostanu soucet casu do lidskeho
> formatu napr. 182:30 (182h 30min).

Resil. Prevedl jsem si cas do int, a pracuji s nim. Scitam si ve svem
programu. Pokud se spokojis jen s minutami, pak muzes scitat i v
databazi. Pokud budes chtit i vteriny, budes muset pracovat s float,
ale ve vlastnim formatu, ne TDateTime.

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Karel Rys

18. 9. 2002 17:01

Ahoj,

zkus neco takoveho:

select sum
       (cast(extract (hour from odeslano) as float)+
        cast(extract (minute from odeslano) as float)/60) as Pokus
from imptisk

Vrati to pocet hodin, minuty jako desetinnou cast.

Karel Rys



David Michal dne 18 Sep 2002 v 16:00:

> Zdravim,
> V databazi (MSSQL) mam v tabulce field Hours(datetime). V tomto fieldu
> ukladam pocet hodin a minut. Nyni bych potreboval udelat SUM(hours) do
> reportu. Jenomze SUM na datetime udelat nemuzu, a pokud to
> prekonvertuji do real, pak pri SUM dostanu nesmysl. Resil jste jiz
> nekdy nekdo neco podobneho? Jak dostanu soucet casu do lidskeho
> formatu napr. 182:30 (182h 30min). Diky, David --- Outgoing mail is
> certified Virus Free. Checked by AVG anti-virus system
> (http://www.grisoft.com). Version: 6.0.389 / Virus Database: 220 -
> Release Date: 16/09/2002

 

    ______ _ ___ Vyssi odborna skola zahradnicka
    \ \/ \_ --- | Stredni zahradnicka skola
    / | | Melnik
   ( | |
    \_ ___/ | e-mail: rys@zas-me.cz
   _/ \\ ______| web: www.zas-me.cz
   \_ / \_/ tel. 0206/623023-5, 0604/846436
     \____/ fax 0206/623009

Odpovedá: Viliam Mlich

18. 9. 2002 16:07

> Jak dostanu soucet casu do lidskeho formatu
> napr. 182:30 (182h 30min).

ja pouzivam toto:

function HourToStr(Doba:TDateTime):string;
begin
  Result := IntToStr(Trunc(Doba*24))+FormatDateTime(':nn',Doba)
end;

Odpovedá: Martin Cajbik

18. 9. 2002 17:29

Zdravim,
pokial ti nevadi, ze to nie je cez jeden select tak napriklad takto:

DECLARE @minuty int, @hodiny int

SELECT @minuty = SUM(DATEPART([hour], hours) * 60 + DATEPART([minute],
hours))
FROM tabulka

SELECT @hodiny = @minuty / 60
SELECT @minuty = @minuty % 60

SELECT CAST(@hodiny AS varchar) + ':' + CAST(@minuty AS varchar)

tento system bude vyhovat, pokial ziaden zo zadanych casov nie je vacsi
alebo rovny 24 hodin a zadane casy mozu mat aj rozny datum.

pokial ma byt vysledok opat datetime a zadane casy nemaju k sebe ziaden
datum (lepsie povedane maju datum 1.1.1900) mozes rovno napisat

SELECT CAST(SUM(CAST(hours AS float)) AS datetime)
FROM tabulka

Toto bude vyhovovat aj ked prekrocis 24 hodin (v niektorom zadanom case).
Pripadne si nieco nakombinuj podla vlastnych potrieb.
Datum je v MSSQL (podobne ako v Delphi) v podstate float, ktory urcuje pocet
dni od pociatocneho (v tomto pripade 1.1.1900) datumu a hodiny, minuty... su
zapisane ako pomerna cast dna za desatinnou ciarkou.

> Zdravim,
> V databazi (MSSQL) mam v tabulce field Hours(datetime). V tomto fieldu
> ukladam pocet hodin a minut. Nyni bych potreboval udelat SUM(hours) do
> reportu. Jenomze SUM na datetime udelat nemuzu, a pokud to prekonvertuji
do
> real, pak pri SUM dostanu nesmysl. Resil jste jiz nekdy nekdo neco
> podobneho? Jak dostanu soucet casu do lidskeho formatu napr. 182:30 (182h
> 30min).
> Diky,
> David
> ---
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.389 / Virus Database: 220 - Release Date: 16/09/2002
>
>

Odpovedá: Blazek Jaroslav

18. 9. 2002 17:02

Ahoj,

> david.michal@www-bv.com 18.9.02 16:00 >>>
>V databazi (MSSQL) mam v tabulce field Hours(datetime). V tomto fieldu
>ukladam pocet hodin a minut. Nyni bych potreboval udelat SUM(hours) do
>reportu. Jenomze SUM na datetime udelat nemuzu, a pokud to prekonvertuji do
>real, pak pri SUM dostanu nesmysl. Resil jste jiz nekdy nekdo neco
>podobneho? Jak dostanu soucet casu do lidskeho formatu napr. 182:30 (182h
>30min).

bud jednim dotazem nebo pomoci poddotazu

1.
SELECT CONVERT(VARCHAR(10),CONVERT(INT,
        SUM(CONVERT(FLOAT,DATEPART(hh,Datum))+
            CONVERT(FLOAT,DATEPART(mi,Datum)/60.0))))+
       ':'+
       CONVERT(VARCHAR(10),
        ROUND((SUM(CONVERT(FLOAT,DATEPART(mi,Datum))/60.0)-
               
CONVERT(INT,SUM(CONVERT(FLOAT,DATEPART(mi,Datum))/60.0)))*60.0,0)),
FROM Tabulka

2.
SELECT CONVERT(VARCHAR(10),CONVERT(INT,Hodiny+Minuty)) +
            ':' +
            CONVERT(VARCHAR(10),CONVERT(INT,ROUND((Minuty -
CONVERT(INT,Minuty))*60.0,0)))
FROM
 (SELECT SUM(CONVERT(FLOAT,DATEPART(hh,Datum))) AS Hodiny,
       SUM(CONVERT(FLOAT,DATEPART(mi,Datum))/60.0) AS Minuty
  FROM Tabulka) t

S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Blazek Jaroslav

18. 9. 2002 19:10

Ahoj,

S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

>>> delphi@zas-me.cz 18.9.02 16:42 >>>
>select sum
> (cast(extract (hour from odeslano) as float)+
> cast(extract (minute from odeslano) as float)/60) as Pokus
>from imptisk

nechapu jak ti tohle muze chodit....

Odpovedá: Karel Rys

19. 9. 2002 6:55

Blazek Jaroslav dne 18 Sep 2002 v 19:33:

> >select sum
> > (cast(extract (hour from odeslano) as float)+
> > cast(extract (minute from odeslano) as float)/60) as Pokus
> >from imptisk
>
> nechapu jak ti tohle muze chodit....

Proc by nemohlo?  

Na FireBird, "Odeslano" je TimeStamp.

Prvni radek vezme pocet hodin a prevede je na float.
Druhy radek vezme pocet minut, prevede je na float, a abychom to mohli rozumne
poscitat, deli to
60 a pricte k tem hodinam.
No a na to se pusti SUM... Takze vysledek je napr. 1065,564 hodiny, coz si uz v
aplikaci snadno
zobrazi jako hodiny a minuty v takovem tvaru, v jakem potrebuje; tedy alespon
jsem nepredpokladal,
ze je nutne, aby to uz z Interbase padalo ve formatu "123:45"...

Proc se ti to nepozdava?

Karel Rys

Odpovedá: Blazek Jaroslav

19. 9. 2002 9:25

Ahoj,

>> delphi@zas-me.cz 19.9.02 7:54 >>>
>select sum
> (cast(extract (hour from odeslano) as float)+
> cast(extract (minute from odeslano) as float)/60) as Pokus
>from imptisk

>Proc by nemohlo?  
>Na FireBird, "Odeslano" je TimeStamp.

>> david.michal@www-bv.com 18.9.02 16:00 >>>
>V databazi (MSSQL) mam v tabulce field Hours(datetime)

asi proto....

S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644